package com.hzit.hzb.core.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hzit.common.exception.Assert;
import com.hzit.common.result.ResponseEnum;
import com.hzit.hzb.core.enums.UserBindEnum;
import com.hzit.hzb.core.hfb.FormHelper;
import com.hzit.hzb.core.hfb.HfbConst;
import com.hzit.hzb.core.hfb.RequestHelper;
import com.hzit.hzb.core.pojo.entity.UserBind;
import com.hzit.hzb.core.mapper.UserBindMapper;
import com.hzit.hzb.core.pojo.entity.UserInfo;
import com.hzit.hzb.core.pojo.vo.UserBindVO;
import com.hzit.hzb.core.service.UserBindService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hzit.hzb.core.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 用户绑定表 服务实现类
 * </p>
 *
 * @author hbxfwf
 * @since 2024-08-27
 */
@Service
public class UserBindServiceImpl extends ServiceImpl<UserBindMapper, UserBind> implements UserBindService {
	@Autowired
	private UserInfoService userInfoService;
	/**
	 * 1. 实现用户绑定功能
	 * @param vo
	 * @param userId
	 * @return
	 */
	@Override
	public String userBind(UserBindVO vo, Long userId) {
		// 1.1 根据用户绑定的数据vo，查询出是否有某个身份证号绑定多个userId
		UserBind userBind = this.getOne(new QueryWrapper<UserBind>()
				.eq("id_card", vo.getIdCard())
				.ne("user_id", userId)
		);
		// 1.2 使用断言来抛出异常
		Assert.isNull(userBind, ResponseEnum.USER_BIND_IDCARD_EXIST_ERROR);
		// 1.3 在userbind表中根据user_id查询是否有记录，如果有就更新，没有就插入一条
		userBind = this.getOne(new QueryWrapper<UserBind>().eq("user_id", userId));
		if(userBind == null){   // ① 如果不存在就添加
			userBind = new UserBind();
			BeanUtil.copyProperties(vo,userBind);
			userBind.setStatus(UserBindEnum.NO_BIND.getStatus());   // 设置状态为未绑定状态
			userBind.setUserId(userId);
			this.save(userBind);
		}else{                  // ② 如果存在就修改
			BeanUtil.copyProperties(vo,userBind);
			this.updateById(userBind);
		}

		// 1.4 构造生成表单的map集合的参数
		Map<String, Object> userBindParams = new HashMap<>();
		userBindParams.put("agentId",HfbConst.AGENT_ID);        // 给商户分配的唯一标识
		userBindParams.put("agentUserId",userId);               // 用户id
		userBindParams.put("idCard",vo.getIdCard());            // 身份证号
		userBindParams.put("personalName",vo.getName());        // 用户姓名
		userBindParams.put("bankType",vo.getBankType());        // 银行类型
		userBindParams.put("bankNo",vo.getBankNo());            // 银行卡号
		userBindParams.put("mobile",vo.getMobile());            // 手机号
		userBindParams.put("returnUrl",HfbConst.USERBIND_RETURN_URL);               // 同步回调地址
		userBindParams.put("notifyUrl",HfbConst.USERBIND_NOTIFY_URL);               // 异步回调地址
		userBindParams.put("timestamp", RequestHelper.getTimestamp());               // 时间戳
		String sign = RequestHelper.getSign(userBindParams);                         // 生成签名
		userBindParams.put("sign",sign);                        // 验签字符串
		// 1.5 生成表单字符串
		String formStr = FormHelper.buildForm(HfbConst.USERBIND_URL,userBindParams);
		return formStr;
	}

	/**
	 * 异步回调，由汇付报平台发送信息
	 * @param map
	 */
	@Override
	public void hzbNotify(Map<String, Object> map) {
		// 1. 得到用户id字符串
		String userIdStr = (String) map.get("agentUserId");
		if(StrUtil.isNotBlank(userIdStr)){
			// 第一部分：修改UserBind表
			Long userId = Long.parseLong(userIdStr);
			// 2. 在用户绑定表中查询出userBind的信息
			UserBind userBind = this.getOne(new QueryWrapper<UserBind>().eq("user_id", userId));
			// 3. 修改用户绑定表的信息
			userBind.setStatus(UserBindEnum.BIND_OK.getStatus());           // 设置用户绑定状态值
			userBind.setBindCode(map.get("bindCode") + "");                 // 设置绑定的协议号
			// 4. 修改到数据库中
			this.updateById(userBind);

			// 第二部分：修改UserInfo表
			// 2.1 根据userId查询出userInfo
			UserInfo userInfo = userInfoService.getById(userId);
			// 2.2 修改Userinfo表的信息
			userInfo.setName(userBind.getName());
			userInfo.setIdCard(userBind.getIdCard());
			userInfo.setBindCode(map.get("bindCode") + "");
			userInfo.setBindStatus(UserBindEnum.BIND_OK.getStatus());
			// 2.3 修改到数据库中
			userInfoService.updateById(userInfo);
		}
	}

	/**
	 * 根据userid查询出bind_code
	 * @param investUserId
	 * @return
	 */
	@Override
	public String getUserBind(Long investUserId) {
		return this.getOne(new QueryWrapper<UserBind>().eq("user_id",investUserId)).getBindCode();
	}
}
